package com.zyb.insurance.policy.infrastructure;

import com.zyb.insurance.common.RedisClient;
import org.springframework.stereotype.Component;
import redis.clients.jedis.Jedis;
import java.util.*;

/**
 * redis管理组件
 */
@Component
public class RedisManager {

    /**
     * 构建保单数据的分页索引
     * @param insurancePolicyId
     */
    public void buildInsurancePolicyPageIndex(String insurancePolicyId) throws Exception {
        // 构建保单的分页数据

        // 对redis里的保单的总数量进行累加，insurance_policy::total_count=333e

        // 另外一个是对redis里的每一页的分页索引，往里面去加入你的保单id
        // 我们需要去封装一个lua脚本，每次都提交一个lua脚本到redis里面去，lua脚本的逻辑

        // 检查当前最新的一个分页索引是什么，insurance_policy::current_page=5
        // 检查当前最新的这一页是否满了，一页就20条数据，检查insurance_policy::page::5，是否满20条数据了
        // 如果还没满，此时把你最新的这个保单id写入这一页就可以了，否则就创建新的一页
        // insurance_policy::current_page=6，insurance_policy::page::6加入保单id

        String luaScript = ""
                // 如果不存在创建nsurance_policy::total_count=0,之后就开始累加
                + "redis.call('setnx', 'insurance_policy::total_count', 0);"
                + "redis.call('incr', 'insurance_policy::total_count');"
                // 如果insurance_policy::current_page不存在，创建并设为1
                + "redis.call('setnx', 'insurance_policy::current_page', 1);"
                + "local currentPage = redis.call('get', 'insurance_policy::current_page');"
                + "local existsCurrentPage = redis.call('exists', 'insurance_policy::page::' .. currentPage);"

                + "if (existsCurrentPage == 0) "
                + "then "
                    + "redis.call('lpush', 'insurance_policy::page::' .. currentPage, '" + insurancePolicyId + "');"
                + "else "
                    + "local currentPageCount = redis.call('llen', 'insurance_policy::page::' .. currentPage);"
                    + "if (currentPageCount < 20) "
                    + "then "
                        + "redis.call('lpush', 'insurance_policy::page::' .. currentPage, '" + insurancePolicyId + "');"
                    + "else "
                        + "redis.call('incr', 'insurance_policy::current_page');"
                        + "currentPage = currentPage + 1;"
                        + "redis.call('lpush', 'insurance_policy::page::' .. currentPage, '" + insurancePolicyId + "');"
                    + "end;"
                + "end;"

                + "return 'success';";

        RedisClient redisClient = RedisClient.getInstance();
        Jedis jedis = redisClient.getJedis();
        jedis.eval(luaScript);
    }

    /**
     * 基于分页索引查询保单分页id
     * @param page
     * @throws Exception
     */
    public List<String> queryInsurancePolicyByPage(int page) throws Exception {
        // 分页查询的时候，刚开始是第一页，page=1
        // insurance_policy::page::1，查出来，另外查出来保单的总数量
        // 接下来你可以自己去点击想要进入的页码，任意的跳转到某一页去，page=n
        // 每次查到一页数据的保单id集合之后，就可以根据id把你需要的保单数据从hbase里提取出来
        // 这样子做就完全没有所谓的深分页的问题了，而且跳转到任何一页，性能都极为的高

        RedisClient redisClient = RedisClient.getInstance();
        Jedis jedis = redisClient.getJedis();
        return jedis.lrange("insurance_policy::page::" + page, 0, -1);
    }

    /**
     * 查询保单数据总量
     * @return
     * @throws Exception
     */
    public Integer queryInsurancePolicyCount() throws Exception {
        RedisClient redisClient = RedisClient.getInstance();
        Jedis jedis = redisClient.getJedis();
        return Integer.valueOf(jedis.get("insurance_policy::total_count"));
    }

}
